home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_13_03
/
grant
/
pop.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1994-12-22
|
3KB
|
122 lines
#include <stdlib.h>
#include <stdio.h>
#include <float.h>
#include <assert.h>
#include <string.h>
#include "pop.h"
#include "random.h"
// Constructor. It creates a population of chromosomes
// where the probability that each bit is true
// increases with each creation, then it creates a
// compliment of each of the created chromosomes.
CGAPopulation::CGAPopulation(
unsigned int Size,
unsigned int Length,
float MaxMutationRate)
{
assert(Size && Length);
m_MaxSize = Size;
m_CurrentSize = 0;
m_Generation = 0;
m_MaxMutationRate = MaxMutationRate;
m_Data = new CGAChromosome*[m_MaxSize];
CGAChromosome::InitializeChromosomeClass(Length);
for (unsigned int idx = 1; idx <= m_MaxSize / 2;
idx++) {
CGAChromosome* Temp =
new CGAChromosome(idx / (float)m_MaxSize);
CGAChromosome* CompTemp = Temp->Compliment();
Merge(Temp);
Merge(CompTemp);
}
}
// Default destructor
CGAPopulation::~CGAPopulation()
{
for (unsigned int idx = 0; idx < m_MaxSize; idx++) {
delete m_Data[idx];
}
delete m_Data;
}
// Merge sort the new chromosome, assume that there no
// holes in the array.
void CGAPopulation::Merge(
CGAChromosome* NewChromosome)
{
assert(m_CurrentSize < m_MaxSize);
for (unsigned int idx = 0; idx < m_CurrentSize;
idx++) {
if (NewChromosome->GetFitness() >
m_Data[idx]->GetFitness()) {
break;
}
}
memmove(&m_Data[idx + 1], &m_Data[idx],
sizeof(m_Data) * (m_CurrentSize - idx));
m_Data[idx] = NewChromosome;
m_CurrentSize++;
}
// These functions randomly select a chromosome from
// the ranked array, where the probability of selection
// is related to the individual's position in the
// array. ReplaceChromosome calculates an individual's
// probability for replacement by Rank(X) / Total.
// GetParent calculates an individual's probability for
// parenthood by (Total - Rank(X)) / Total).
CGAChromosome* CGAPopulation::GetParent()
{
float Selection;
do {
Selection = Rand0UpTo1();
} while (Flip(Selection));
return m_Data[(int)(Selection * m_MaxSize)];
}
// Replace a poor chromosome with the new one.
void CGAPopulation::ReplaceChromosome(
CGAChromosome* NewChromosome)
{
float Selection;
do {
Selection = Rand0UpTo1();
} while (Flip(Selection));
unsigned int idx = m_MaxSize -
(int)(Selection * m_MaxSize) - 1;
delete m_Data[idx];
memmove(&m_Data[idx], &m_Data[idx + 1],
sizeof(m_Data) * (m_CurrentSize - idx - 1));
m_CurrentSize--;
Merge(NewChromosome);
}
// Create two offspring and replace two members of the
// chromosome array.
void CGAPopulation::CreateNextGeneration(void)
{
CGAChromosome *Parent1, *Parent2, *Child1, *Child2;
Parent1 = GetParent();
Parent2 = GetParent();
Crossover(Parent1, Parent2, Child1, Child2,
CalcSimilarityRatio(Parent1, Parent2) *
m_MaxMutationRate);
ReplaceChromosome(Child1);
ReplaceChromosome(Child2);
m_Generation++;
}